package bean;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.apache.log4j.Logger;

import bean.remote.ArticuloRemoto;
import bean.remote.ConfiguracionRemote;
import bean.remote.MQSenderRemote;
import bean.remote.NotificadorLogisticaRemote;
import dominio.Articulo;
import dominio.Configuracion;
import dominio.ModuleType;

@Stateless(name = "articuloBean")
@Remote(ArticuloRemoto.class)
public class ArticuloBean implements ArticuloRemoto {

	private final static Logger logger = Logger.getLogger(ArticuloBean.class);

	@PersistenceContext(unitName = "webDS")
	private EntityManager em;

	@EJB(beanName = "configuracionBean")
	private ConfiguracionRemote configuracionRemote;

	@EJB(beanName = "mqSenderBean")
	private MQSenderRemote mqSenderRemote;

	@EJB(beanName = "notificadorLogisticaBean")
	private NotificadorLogisticaRemote notificadorLogisticaRemote;

	@Override
	public Articulo crear(Articulo articulo, boolean notify) {
		em.persist(articulo);
		logger.info("Se creo el siguiente articulo " + articulo);
		if (notify) {
			List<Configuracion> configuracions = configuracionRemote
					.findAllActives();
			List<Configuracion> configuracionsSender = new ArrayList<Configuracion>();
			for (Configuracion configuracion : configuracions) {
				if (ModuleType.DESPACHO.equals(configuracion.getModuleType())
						|| ModuleType.PORTAL.equals(configuracion
								.getModuleType())) {
					configuracionsSender.add(configuracion);
				}
			}

			mqSenderRemote.send(configuracionsSender, articulo.toXML());
			logger.info("Se envio el mensaje a las colas de mensajeria");
			notificadorLogisticaRemote
					.notificar("creando el articulo de codigo: " + articulo);
		}
		return articulo;
	}

	@Override
	public void borrar(Long codigo) {
		Articulo articuloEncontrado = em.find(Articulo.class, codigo);
		notificadorLogisticaRemote.notificar("Borrando el articulo de codigo: "
				+ codigo);
		em.remove(articuloEncontrado);
	}

	@Override
	public Articulo findByCodigo(Long codigo) {
		notificadorLogisticaRemote
				.notificar("Buscancando el articulo de codigo: " + codigo);
		return em.find(Articulo.class, codigo);
	}

	@Override
	public List<Articulo> findAll() {
		TypedQuery<Articulo> query = em.createQuery("from Articulo a",
				Articulo.class);
		List<Articulo> list = query.getResultList();
		notificadorLogisticaRemote.notificar("Buscar todos los articulos");
		return list;
	}

	@Override
	public void aumentarStock(Articulo articulo, Integer cantidad) {
		articulo.aumentarStock(cantidad);
		em.merge(articulo);
		notificadorLogisticaRemote.notificar("Aumentando stock del articulo: "
				+ articulo + " con la cantidad " + cantidad);
		logger.info("Se aumento el stock del articulo " + articulo + " en "
				+ cantidad);
	}

	@Override
	public void descontarStock(Articulo articulo, Integer cantidad) {
		articulo.descontarStock(cantidad);
		em.merge(articulo);
		notificadorLogisticaRemote.notificar("Descontando stock del articulo: "
				+ articulo + " con la cantidad " + cantidad);
		logger.info("Se desconto el stock del articulo " + articulo + " en "
				+ cantidad);
	}
}